package br.com.arg.aplica.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlRootElement;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import br.com.arg.aplica.util.Obrigatorio;
import br.com.arg.aplica.util.TipoCampo;

@Entity
@XmlRootElement
//@Table(name="CAMPO", uniqueConstraints = @UniqueConstraint(columnNames = {"formato", "nome"}))
public class Atributo implements Serializable {
	/** Default value included to remove warning. Remove or modify at will. **/
	private static final long serialVersionUID = 1L;
	
	public Atributo()
	{
		this.nome = "NovoAtributoZ1";
		this.nomeColuna = "NOVO_ATRIBUTO_Z1";
		this.ehOpcional = false;
		this.descricao = "Descrição do atributo NovoAtributoZ1";
		this.tamanho = 12;
		this.textoLivre = "Texto livre para o atributo NovoAtributoZ1";
		this.tipoCampo = TipoCampo.AlfaNumerico;
		this.valor = "Z1";
		this.versao = "001";
		this.setDominios(new ArrayList<Dominio>());
		this.setRegras(new ArrayList<Regra>());
	}
	
	@Id
	@NotNull
	@GeneratedValue
	private Long id;

	@NotNull
	@Obrigatorio(min = "1", max = "32")	
	private String nome;

	@NotNull
	@Obrigatorio(min = "1", max = "32")	
	private String nomeColuna;
	
	@NotNull
	@Obrigatorio	
	private Boolean ehOpcional;
	
	@NotNull
	@Obrigatorio(min = "1", max = "255")	
	private String descricao;

	@NotNull
	@Obrigatorio(min = "1")	
	private int tamanho;

	@Enumerated
	@NotNull
	private TipoCampo tipoCampo;

	@NotNull
	@Obrigatorio(min = "1", max = "255")	
	private String valor;

	@NotNull
	@Obrigatorio(min = "1", max = "10")	
	private String versao;

	@NotNull
	@Obrigatorio(min = "1", max = "255")	
	private String textoLivre;
	
	@OneToMany(cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<Dominio> dominios;	
	
	@OneToMany(cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<Regra> regras;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNomeColuna() {
		return nomeColuna;
	}

	public void setNomeColuna(String nomeColuna) {
		this.nomeColuna = nomeColuna;
	}

	public Boolean getEhOpcional() {
		return ehOpcional;
	}

	public void setEhOpcional(Boolean ehOpcional) {
		this.ehOpcional = ehOpcional;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public int getTamanho() {
		return tamanho;
	}

	public void setTamanho(int tamanho) {
		this.tamanho = tamanho;
	}

	public TipoCampo getTipoCampo() {
		return tipoCampo;
	}

	public void setTipoCampo(TipoCampo tipoCampo) {
		this.tipoCampo = tipoCampo;
	}

	public String getValor() {
		return valor;
	}

	public void setValor(String valor) {
		this.valor = valor;
	}

	public String getVersao() {
		return versao;
	}

	public void setVersao(String versao) {
		this.versao = versao;
	}

	public String getTextoLivre() {
		return textoLivre;
	}

	public void setTextoLivre(String textoLivre) {
		this.textoLivre = textoLivre;
	}

	public List<Dominio> getDominios() {
		return dominios;
	}

	public void setDominios(List<Dominio> dominios) {
		this.dominios = dominios;
	}

	public List<Regra> getRegras() {
		return regras;
	}

	public void setRegras(List<Regra> regras) {
		this.regras = regras;
	}	
}
